home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / graphics / degas2ps.arc / DEGAS2PS.C next >
C/C++ Source or Header  |  1989-06-20  |  33KB  |  1,071 lines

  1. /*******************************************************************/
  2. /*                                                                                                                                */
  3. /*         DEGAS2PS.PRG                                                                                                 */
  4. /* Programme d'impression d'images provenant de DEGAS (.PI3).      */
  5. /* La sortie se fait en PostScript vers un fichier ou une laser.   */
  6. /* Il est possible de sélectionner une partie de l'image,                  */
  7. /* la réduction ou l'augmentation ainsi que la position sur                 */
  8. /* la page.                                                                                                                */
  9. /* IRISA de RENNES                                                                                                    */
  10. /*                                                                                                                               */
  11. /* Matériels : ATARI 1040 STFM + LaserWriter II NT                               */
  12. /* Langage : Megamax C                                                                                       */
  13. /*                                                                                                                               */
  14. /* ecrit par :     Bertrand DECOUTY (IRISA-INRIA, Rennes)                         */
  15. /*                            Philippe LE THOMAS (stage IUT Lannion 1988)                 */
  16. /*                                                                                                                                 */
  17. /*******************************************************************/
  18. char version[]= "DEGAS2PS 1.53";
  19.  
  20. /* 1= francais, 0= anglais */
  21. #define FRANCAIS 0
  22.  
  23. #include <stdio.h>
  24. #include <osbind.h>
  25. #include <gembind.h>
  26. #include <gemdefs.h>
  27. #include <obdefs.h>
  28. #include <string.h>
  29. #include "DEGAS2PS.H"
  30. #define RESSOURCE "DEGAS2PS.RSC"
  31.  
  32. #if FRANCAIS
  33. #define MESS0 "[3][ | Le fichier ressource | est introuvable... ][ STOP ]"
  34. #define MESS1 "[2][ | Le périphérique n'est | pas connecté... ][ OK | ANNULER ]"
  35. #define MESS2 "[3][ | Erreur lors de l'ouverture | du fichier de sortie... ][ STOP ]"
  36. #define MESS3 "[2][ | Voulez-vous réellement | stopper l'impression ? ][ NON | OUI ]"
  37. #define MESS4 "[3][ Erreur d'écriture | du fichier PostScript ...| disque plein ? ][ STOP ]"
  38. #define MESS5 "[3][ | Erreur lors de l'ouverture | du fichier image... ][ STOP ]"
  39.  
  40. #else         /* messages en anglais */
  41. #define MESS0 "[3][ | Resource file | not found... ][ STOP ]"
  42. #define MESS1 "[2][ | Peripheral device | not connected or off-line... ][ OK | CANCEL ]"
  43. #define MESS2 "[3][ | I can't open | output file... ][ STOP ]"
  44. #define MESS3 "[2][ | Do you really want | to stop printing ? ][ NO | YES ]"
  45. #define MESS4 "[3][ I/O error while | writing PostScript file | disk full ?][ Sorry.. ]"
  46. #define MESS5 "[3][ | I can't open | image file... ][ STOP ]"
  47. #endif
  48.  
  49. #define void /**/
  50. #define VRAI 1
  51. #define FAUX 0
  52. #define RESW 639                                                            /* Largeur maximale de l'écran */
  53. #define RESH 399                                                            /* Hauteur maximale de l'écran */
  54. #define Souris_Croix graf_mouse(5,&dummy)
  55. #define Souris_Normale graf_mouse(0,&dummy)
  56. #define Cache_Souris graf_mouse(256,&dummy)
  57. #define Montre_Souris graf_mouse(257,&dummy)
  58.  
  59. /* structure pour informations sur fichier */
  60. /*
  61. typedef struct {
  62.     long b_free;
  63.     long b_total;
  64.     long b_secsiz;
  65.     long b_clsiz;
  66. } disk_info;
  67. */
  68.  
  69. /* variables utilisées par le GEM */
  70.  
  71. int work_in[] = {1,1,1,1,1,1,1,1,1,1,2};
  72. int work_out[57],contrl[12],intin[256],intout[256],
  73.     ptsin[128],ptsout[128];
  74.  
  75. /* variables globales */
  76.  
  77. int periph; /* indique le peripherique de sortie : 0 = centronics (PRT:) */
  78.                         /*                                                                         1 = RS 232     (AUX:) */
  79.                         /*                                                                         2 = fichier (file.PS) */
  80. int    handle,x,y,w,h,xres,yres,nombre,sortie,
  81.     xsouris,ysouris,etatbout,etatclav,codeclav,nbpress,event,
  82.     xdial,ydial,wdial,hdial,test,mgbuf[11],debut,lon,
  83.     xstart,ystart,width,height,xso,yso,swo,sho,ouvert,
  84.     rx,ry,rw,rh,dummy,boxw,boxh,deja,sw,sh,suppl,
  85.     w_handle,wx,wy,wh,ww,lecture,ecriture;
  86.  
  87. MFDB dfbb;
  88. MFDB dfbs ={0L,0,0,0,0,0,0,0,0};
  89. int frmary[8],clpry[4],fin;
  90. long buffer,ecran;
  91. char source[80],tex[4][80],mode[80],cheminlecture[80],
  92.          cheminecriture[80],nomfenetre[50],nomsortie[30];
  93. OBJECT *barre,*dial;
  94. /**************************************************************************/
  95. /* initialisation des tableaux contenant les coordonnées des     */
  96. /* blocs pour le clipping                                                                         */
  97.  
  98. void init()
  99.  
  100. {        
  101. /*    xres = work_out[0]+1;
  102.     yres = work_out[1]+1;*/
  103. /*    vq_extnd(handle,1,work_out);    */
  104. /*    dfbb.fd_addr initialise ulterieurement  */
  105.     dfbb.fd_w                = work_out[0]+1;
  106.     dfbb.fd_h                = work_out[1]+1;
  107.     dfbb.fd_wdwidth    = dfbb.fd_w / 16;
  108.     dfbb.fd_stand        =0;
  109.     dfbb.fd_nplanes    =1;
  110.     ouvert = lecture = ecriture = FAUX;
  111. /* lecture des coordonnées maximales de la fenetre */
  112.     wind_get(0,WF_WORKXYWH,&wx,&wy,&ww,&wh);
  113.     buffer = Malloc((long)(32000+256+256));
  114.     w_handle = wind_create(NAME,wx,wy,ww,wh);
  115. }
  116. /**************************************************************************/
  117. void main()
  118.  
  119. {
  120.     int i;
  121.     register int boucle;
  122.     
  123. /* Initialisation des variables utilisées par le système */
  124.     for (boucle=1; boucle<10; work_in[boucle++]=1);
  125.     work_in[10]=2;
  126.     appl_init();
  127.     Cache_Souris;
  128. /* ouverture de la station de travail virtuelle */
  129.     handle = graf_handle(&i,&i,&i,&i);
  130.     v_opnvwk(work_in,&handle,work_out);
  131.     init();                            
  132.     Montre_Souris;
  133. /* chargement du fichier ressource contenant le menu, */
  134. /* les boites de dialogue et les différentes icones */
  135.     if (!rsrc_load(RESSOURCE))
  136.     {
  137.         form_alert(1,MESS0);
  138.     }
  139.     else
  140.     {
  141. /* affichage du menu et lecture de son adresse dans l'arbre    */            
  142.         Souris_Normale;
  143.         rsrc_gaddr(R_TREE,MENU,&barre);
  144.         edition();
  145.     }                                                
  146.     quitter();
  147. }
  148. /**************************************************************************/
  149. /* fermeture de la station, de le fenetre et liberation de la    */
  150. /* memoire                                                                                                         */
  151. void quitter()
  152.  
  153. {
  154.     menu_bar(barre,FAUX);
  155. /* on libère la mémoire occupée par l'image */
  156.     Mfree(buffer);
  157.     if (ouvert) 
  158.     {
  159. /* effacement de la fenetre */
  160.         wind_close(w_handle);
  161.         wind_delete(w_handle);
  162.     }
  163.     v_clsvwk(handle);
  164.     Souris_Normale;
  165.     Montre_Souris;
  166.     appl_exit();
  167. }
  168. /**************************************************************************/
  169. /* routine de copie de bloc                                                             */
  170. /* drap : 1 = copie sans changement, 0 = inversion video */
  171. void image(sx,sy,dx,dy,l,h,drap)
  172.  
  173. register int sx,sy,dx,dy,l,h,drap;
  174. {
  175.     frmary[0]=sx;        
  176.     frmary[1]=sy;            
  177.     frmary[2]=sx+l-1;    
  178.     frmary[3]=sy+h-1;        
  179.     frmary[4]=dx;        
  180.     frmary[5]=dy;        
  181.     frmary[6]=dx+l-1;    
  182.     frmary[7]=dy+h-1;
  183.     clpry[0]=dx;
  184.     clpry[1]=dy;
  185.     clpry[2]=dx+l-1;
  186.     clpry[3]=dy+h-1;
  187.     vs_clip(handle,1,clpry);
  188.     Cache_Souris;
  189.     if (drap) 
  190.         vro_cpyfm(handle,3,frmary,dfbb,dfbs);
  191.     else 
  192.         vro_cpyfm(handle,12,frmary,dfbb,dfbs);
  193.     Montre_Souris;
  194. }
  195. /**************************************************************************/
  196. /* attend un appui sur le bouton gauche pour renvoyer les coordonnées */
  197. /* de la souris, si bouton droit => on quitte. Un appui sur ALTERNATE */
  198. /* réinitialise l'ecran                                                                                             */
  199. void gestion()
  200.  
  201. {
  202.     int bouton,key;
  203.  
  204.     Souris_Croix;
  205.     undo();
  206.     do
  207.     {
  208.         event = evnt_mouse(0,0,0,RESW,RESH,&xsouris,&ysouris,&bouton,&key);
  209. /* test le bouton gauche */
  210.         if (bouton & 0x0001) souris();
  211. /* test la touche ALT */
  212.         if (key & 0x0008) undo();
  213.     }    
  214. /* test le bouton droit */
  215.     while (!(bouton & 0x0002));
  216.     Souris_Normale;
  217. }
  218. /**************************************************************************/
  219. /* restitution de l'écran original */
  220. void undo()
  221.  
  222. {
  223.     deja = FAUX;
  224.     sho = 400; swo = 640;
  225.     image(0,0,0,0,RESW+1,RESH+1,VRAI);
  226. }
  227. /**************************************************************************/
  228. /* affichage d'un rectangle de sélection pour indiquer la zone */
  229. /* que l'on désire imprimer                                                                            */
  230. void souris()
  231.  
  232. {
  233.     int status,x,y,xx,yy,xd,yd;
  234.     char message[80],texte[50];
  235.     
  236.     undo();
  237.     deja = VRAI;
  238.     xx = x = 0; yy = y = 0;
  239.     xd = xsouris;
  240.     yd = ysouris;
  241.     Cconout(0x07);
  242.     do
  243.     {
  244.         vq_mouse(handle,&status,&x,&y);
  245.         if ((xx != x) || (yy != y)) 
  246.         {
  247.             image(xd,yd,xd,yd,xx-xd+1,yy-yd+1,VRAI);
  248.             image(xd,yd,xd,yd,x-xd+1,y-yd+1,FAUX);
  249.             xx = x; yy = y;
  250.         }
  251.     }
  252.     while ((status & 0x0001));
  253. /*    form_alert(1,MESS6);*/
  254.     Souris_Croix;
  255.     if (xd <= x) { xso = xd;swo = x - xso; }
  256.     else { xso = x;swo = xd - xso; }
  257.     if (yd <= y) { yso = yd;sho = y - yso; }
  258.     else { yso = y;sho = yd - yso; }
  259.     Cconout(0x07);
  260. }
  261. /**************************************************************************/
  262. /* gestion des évènements : menu, raffraichissement écran */
  263. void edition()
  264.  
  265. {
  266.     int xstart,ystart,wstart,hstart,rx,ry,rh,rw;
  267.